<?php

declare(strict_types=1);

namespace App\CustHub\Helpers;

class SaasSign
{
    /**
     * 生成签名
     *
     * 通过对给定参数进行特定的处理和排序，然后使用密钥对其进行加密，
     * 生成一个用于验证请求合法性的签名字符串。
     *
     * @param array $params 需要参与签名生成的参数数组
     *
     * @return string 生成的签名字符串
     */
    public function generateSign(array $params): string
    {
        unset($params['main_uid']);
        ksort($params);
        $sign = '';
        foreach ($params as $key => $value) {
            if ($key == 'sign') {
                continue;
            }
            if (is_array($value)) {
                $sign .= $key;
            } elseif (is_object($value)) {
                $sign .= $key;
            } else {
                if (is_null($value)) {
                    $value = '';
                }
                if ($value === true) {
                    $value = '';
                }
                $sign .= $key . $value;
            }
        }
        $secretKey = 'SyDsO2aXnccPR6yU0u0xWFqx01VAmmBJhKb7YqJh4AZouVLaYs9Relr1ODJqLFOEdAn46jts5K6tZGdl+uECkZQ==';
        $sign = md5($sign . $secretKey);
        return $sign;
    }


    /**
     * 检查签名是否有效
     *
     * @param array $params 参数数组，包含用于签名的所有参数
     * @param string $sign 给定的签名字符串
     * @return bool 返回签名是否有效的布尔值，true 表示签名有效，false 表示签名无效
     */
    public function checkSign(array $params, string $sign): bool
    {
        // 生成本地签名字符串
        $localSign = $this->generateSign($params);
        // 比较本地生成的签名与给定的签名是否一致
        return $localSign === $sign;
    }
}